package de.txtippspiel.core.openLigaDB;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import org.apache.axis2.AxisFault;

import de.fh.openliga.ws.SportsdataStub.ArrayOfMatchResult;
import de.fh.openliga.ws.SportsdataStub.Group;
import de.fh.openliga.ws.SportsdataStub.MatchResult;
import de.fh.openliga.ws.SportsdataStub.Matchdata;
import de.txtippspiel.core.model.Begegnung;
import de.txtippspiel.core.model.Ergebnis;
import de.txtippspiel.core.model.Mannschaft;
import de.txtippspiel.core.model.Saison;
import de.txtippspiel.core.model.Spieltag;
import de.txtippspiel.openliga.connector.OpenLigaConnector;

/**
 * Dieser Parser soll letztendlich die Daten aus dem OpenLiga-WS auf unser Klassenmodell transformieren, so dass 
 * die Anwendung unabhaengig vom OpenLiga-WS wird.
 * @author Fabian
 *
 */
public class OpenLigaDBParser {
	
	/**
	 * Diese Funktion parsed die gelieferten Daten einer ganzen Saison
	 * @param jahr as String
	 * @return
	 * @throws RemoteException 
	 */
	public static Saison parseToSaison(String jahr) throws RemoteException{
		Saison s = new Saison();
		List<Spieltag> spieltage = new ArrayList<Spieltag>();
		OpenLigaConnector olConnector = new OpenLigaConnector();
		
		//alle vorhandenen Spieltage lesen
		Group[] alleSpieltageByJahr = olConnector.getAlleSpieltageByJahr(jahr);
		for (Group spieltag : alleSpieltageByJahr) {
			//alle Spiele fuer den Spieltag lesen
			Matchdata[] spieltagData = olConnector.getSpieltagData(jahr, new Integer(spieltag.getGroupOrderID()));
			List<Begegnung> begegnungen = new ArrayList<Begegnung>();
			//parsen matchdata = begegnung
			for (Matchdata matchdata : spieltagData) {
				if(matchdata.getMatchIsFinished()){
					Begegnung spiel = new Begegnung();
					spiel.setAnsetzung(matchdata.getMatchDateTime());
					spiel.setErgebnis(new Ergebnis(OpenLigaDBParser.getErgebnisHeim(matchdata), OpenLigaDBParser.getErgebnisGast(matchdata)));
					spiel.setHeim(new Mannschaft(matchdata.getNameTeam1()));
					spiel.setGast(new Mannschaft(matchdata.getNameTeam2()));
					
					begegnungen.add(spiel);
				}
			}
			Spieltag st = new Spieltag();
			st.setBegegnungen(begegnungen);
			st.setSpieltag(new Integer(spieltag.getGroupOrderID()));
			spieltage.add(st);
		}
		s.setSpieltage(spieltage);
		
		return s;
	}
	
	private static Integer getErgebnisHeim(Matchdata matchdata) throws NumberFormatException{
		ArrayOfMatchResult matchResults = matchdata.getMatchResults();
		MatchResult[] matchResult = matchResults.getMatchResult();
		if(null != matchResult && matchResult.length > 0){
			return new Integer(matchResult[0].getPointsTeam1());
		}
		else
			throw new NumberFormatException("Ergebnis fuer Team1 konnte nicht ermittelt werden!");
	}
	
	private static Integer getErgebnisGast(Matchdata matchdata) throws NumberFormatException{
		ArrayOfMatchResult matchResults = matchdata.getMatchResults();
		MatchResult[] matchResult = matchResults.getMatchResult();
		if(null != matchResult && matchResult.length > 0){
			return new Integer(matchResult[0].getPointsTeam2());
		}
		else
			throw new NumberFormatException("Ergebnis fuer Team2 konnte nicht ermittelt werden!");
	}

}
